﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://www.acwing.com/problem/content/1415/
/*
题目描述：
作为一个资本家，农夫约翰希望通过购买更多的奶牛来扩大他的牛奶业务。

因此，他需要找地方建立一个新的牛棚。

约翰购买了一大块土地，这个土地可以看作是一个 R
 行（编号 1∼R
）C
 列（编号 1∼C
）的方格矩阵。

不幸的是，他发现其中的部分方格区域已经被破坏了，因此他无法在整个 R×C
 的土地上建立牛棚。

经调查，他发现共有 P
 个方格内的土地遭到了破坏。

建立的牛棚必须是矩形的，并且内部不能包含被破坏的土地。

请你帮约翰计算，他能建造的最大的牛棚的面积是多少。

输入格式
第一行包含三个整数 R,C,P
。

接下来 P
 行，每行包含两个整数 r,c
，表示第 r
 行第 c
 列的方格区域内土地是被破坏的。

输出格式
输出牛棚的最大可能面积。

数据范围
1≤R,C≤3000
,
0≤P≤30000
,
1≤r≤R
,
1≤c≤C
输入样例：
3 4 2
1 3
2 1
输出样例：
6
*/
// 开始解题：
// 方法——单调栈
#include <iostream>
#include <stack>
#include <vector>
#include <cstring>
using namespace std;
int n, m, k;
const int N = 3010;
int grid[N][N], h[N][N];
int st[N];
int ret = 0;

void check(int* h) {
	vector<int> temp(m + 1);
	for (int i = 1; i <= m; i++) {
		temp[i] = h[i];
	}
	int top = 1;
	st[0] = 0;
	for (int i = 1; i <= m; i++) {
		while (top && h[st[top - 1]] >= h[i]) {
			top--;
		}
		if (top) {
			temp[i] += (i - st[top - 1] - 1) * h[i];
		}
		st[top++] = i;
	}
	top = 0;
	st[top++] = m + 1;
	for (int i = m; i >= 1; i--) {
		while (top && h[st[top - 1]] >= h[i]) {
			top--;
		}
		if (top) {
			temp[i] += (st[top - 1] - i - 1) * h[i];
		}
		st[top++] = i;
	}
	for (auto x : temp) {
		ret = max(ret, x);
	}
}
int main() {
	scanf("%d%d%d", &n, &m, &k);
	for (int i = 0; i < k; i++) {
		int x = 0, y = 0;
		scanf("%d%d", &x, &y);
		grid[x][y] = 1;
	}

	// 初始化h数组
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (!grid[i][j]) {
				h[i][j] = h[i - 1][j] + 1;
			}
		}
	}

	for (int i = 1; i <= n; i++) {
		check(h[i]);
	}
	cout << ret << endl;
	return 0;
}